use crate::core::types::AppSettings;
use std::fs;
use std::path::PathBuf;
use tauri::Manager;
use log::{debug, info, warn, error};

/// 获取配置文件路径
/// 在开发环境下使用项目目录，生产环境下使用系统配置目录
/// 
/// # 返回值
/// * `Result<PathBuf, String>` - 成功返回配置文件路径，失败返回错误信息
fn get_config_path() -> Result<PathBuf, String> {
    // 检查是否为开发环境
    let is_dev = cfg!(debug_assertions) || std::env::var("TAURI_DEV").is_ok();
    
    let app_config_dir = if is_dev {
        // 开发环境：使用项目目录下的out/config文件夹
        let current_dir = std::env::current_dir()
            .map_err(|e| format!("无法获取当前目录: {}", e))?;
        current_dir.join("out").join("config")
    } else {
        // 生产环境：使用系统配置目录
        let config_dir = dirs::config_dir()
            .ok_or("无法获取配置目录")?;
        config_dir.join("e-shortcuts")
    };
    
    // 确保配置目录存在
    if !app_config_dir.exists() {
        fs::create_dir_all(&app_config_dir)
            .map_err(|e| format!("创建配置目录失败: {}", e))?;
    }
    
    Ok(app_config_dir.join("settings.json"))
}

/// 加载应用设置
#[tauri::command]
pub fn load_settings() -> Result<AppSettings, String> {
    let config_path = get_config_path()?;
    
    if config_path.exists() {
        let content = fs::read_to_string(&config_path)
            .map_err(|e| format!("读取配置文件失败: {}", e))?;
        
        serde_json::from_str(&content)
            .map_err(|e| format!("解析配置文件失败: {}", e))
    } else {
        // 如果配置文件不存在，返回默认设置并保存
        let default_settings = AppSettings::default();
        save_settings(default_settings.clone())?;
        Ok(default_settings)
    }
}

/// 保存应用设置
#[tauri::command]
pub fn save_settings(settings: AppSettings) -> Result<(), String> {
    let config_path = get_config_path()?;
    
    let content = serde_json::to_string_pretty(&settings)
        .map_err(|e| format!("序列化设置失败: {}", e))?;
    
    fs::write(&config_path, content)
        .map_err(|e| format!("保存配置文件失败: {}", e))?;
    
    Ok(())
}

/// 打开设置窗口
#[tauri::command]
pub fn open_settings_window(app: tauri::AppHandle) -> Result<(), String> {
    // 检查设置窗口是否已经存在
    if let Some(settings_window) = app.get_webview_window("settings") {
        settings_window.show().map_err(|e| e.to_string())?;
        settings_window.set_focus().map_err(|e| e.to_string())?;
        return Ok(());
    }
    
    // 创建新的设置窗口
    let settings_window = tauri::WebviewWindowBuilder::new(
        &app,
        "settings",
        tauri::WebviewUrl::App("settings.html".into())
    )
    .title("设置")
    .inner_size(550.0, 700.0)
    .center()
    .resizable(false)
    .maximizable(false)
    .always_on_top(true)
    .build()
    .map_err(|e| format!("创建设置窗口失败: {}", e))?;
    
    settings_window.show().map_err(|e| e.to_string())?;
    Ok(())
}